namespace SharpTalk.Core.Delegates
{
    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="TRequest"></typeparam>
    /// <typeparam name="TResponse"></typeparam>
    /// <param name="request"></param>
    /// <returns></returns>
    public delegate TResponse RequestDelegate<in TRequest, out TResponse>(TRequest request);
    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="TRequest"></typeparam>
    /// <param name="request"></param>
    public delegate void RequestDelegate<in TRequest>(TRequest request);
    /// <summary>
    /// 
    /// </summary>
    public delegate void ActionDelegate();
    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="obj"></param>
    public delegate void ActionDelegate<in T>(T obj);
    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="TReturn"></typeparam>
    /// <typeparam name="T"></typeparam>
    /// <param name="obj"></param>
    /// <returns></returns>
    public delegate TReturn ActionDelegate<out TReturn, in T>(T obj);
    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="TReturn"></typeparam>
    /// <typeparam name="T1"></typeparam>
    /// <param name="obj1"></param>
    /// <typeparam name="T2"></typeparam>
    /// <param name="obj2"></param>
    /// <returns></returns>
    public delegate TReturn ActionDelegate<out TReturn, in T1, in T2>(T1 obj1, T2 obj2);
    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="TReturn"></typeparam>
    /// <returns></returns>
    public delegate TReturn ActionReturnDelegate<out TReturn>();
}